package com.shuran.channelinitialer;

import com.server.protobuf.ImModel;
import com.shuran.handler.CommonHandler;
import com.shuran.handler.HeartHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.protobuf.ProtobufDecoder;
import io.netty.handler.codec.protobuf.ProtobufEncoder;
import io.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import io.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;
import io.netty.handler.timeout.IdleStateHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * code is far away from bug with the animal protecting
 * ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 * 　　┃　　　┃神兽保佑
 * 　　┃　　　┃代码无BUG！
 * 　　┃　　　┗━━━┓
 * 　　┃　　　　　　　┣┓
 * 　　┃　　　　　　　┏┛
 * 　　┗┓┓┏━┳┓┏┛
 * 　　　┃┫┫　┃┫┫
 * 　　　┗┻┛　┗┻┛
 *
 * @Description : function description
 * ---------------------------------
 * @Author : deane
 * @Date : Create in 2020/5/31 11:03
 * <p>
 * Copyright (C)2013-2020 小树盛凯科技 All rights reserved.
 */

@Service
public class ServerChannelInitialer extends ChannelInitializer<SocketChannel> {

    @Autowired
    private CommonHandler commonHandler;

    @Autowired
    private HeartHandler heartHandler;

    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        ChannelPipeline p = socketChannel.pipeline();
        // TODO 添加進行業務處理的Handler
        //检测空闲必须放在这里 因为pipeline是分顺序加载的
        p.addLast("idleStateHandler", new IdleStateHandler(5
                , 0, 0, TimeUnit.SECONDS));
        //解码器必须放在前面，否则发数据收不到
        p.addLast(new ProtobufVarint32FrameDecoder());//添加protobuff解码器
        p.addLast(new ProtobufDecoder(ImModel.Command.getDefaultInstance()));//添加protobuff对应类解码器
        p.addLast(new ProtobufVarint32LengthFieldPrepender());//protobuf的编码器 和上面对对应
        p.addLast(new ProtobufEncoder());//protobuf的编码器

        p.addLast("heartHandler", heartHandler);
        p.addLast("commonHandler", commonHandler);
    }
}
